/*
 * Nome do arquivo: colaboradorDAO.java
 * Autores:	Bruno Villas Bôas           - 317527
 *              Diego Zamboni               - 344990
 *              Endel Guimarães             - 379930
 * 		Guilherme Torres            - 400572
 *		Renan Oliveira              - 380113
 * 
 * Turma: 2012/1
 *
 * Descricao: DAO responsável pela armazenamento físico de colaborador
 *
 * Data de conclusao: 
 */
package cooper.classes.dao;

import com.sun.jmx.remote.internal.ArrayQueue;
import cooper.classes.bean.ColaboradorBean;
import cooper.classes.bean.CooperativaBean;
import cooper.classes.bean.ServicoBean;
import cooper.classes.bean.TipoServicoBean;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

public class ServicoDAO {

    private Connection conn;
    private int total;

    public ServicoDAO() throws CooperDAOException {
        try {
            this.conn = ConnectionCooperFactory.getConnection();
        } catch (Exception e) {
            throw new CooperDAOException("Erro: " + ":\n" + e.getMessage());
        }
    }

    // Cadastra uma colaborador no BD
    public int cadastrar(ServicoBean servico) throws CooperDAOException {
        PreparedStatement ps = null;
        Connection conn = null;

        if (servico == null) {
            throw new CooperDAOException("O valor passado não pode ser nulo");
        }

        try {
            String problema = servico.getProblema();
            String descricao = servico.getDescricao();
            int tipoProblema = servico.getTipoProblema();
            int idCooperativa = servico.getIdCooperativa();

            // Insere a colaborador na base de dados
            String SQL = "INSERT INTO cooperativas_servicos (nome,descricao,idservicos, idcooperativa) VALUES ('" + problema + "','" + descricao + "', " + tipoProblema + ", " + idCooperativa + ")";
            conn = this.conn;
            ps = conn.prepareStatement(SQL);
            ps.executeUpdate();
            ps = conn.prepareStatement("SELECT LAST_INSERT_ID() AS lastId");
            ResultSet rs = ps.executeQuery();
            rs.next();
            return Integer.parseInt(rs.getObject("lastId").toString());
        } catch (SQLException sqle) {
            throw new CooperDAOException("Erro ao inserir dados " + sqle);
        } finally {
            ConnectionCooperFactory.closeConnection(conn, ps);
        }
    } // Fim do cadastrar

    // Altera uma colaborador no BD
    public void alterar(ServicoBean servico) throws CooperDAOException {
        PreparedStatement ps = null;
        Connection conn = null;

        if (servico == null) {
            throw new CooperDAOException("O valor passado não pode ser nulo");
        }

        try {
            int id = servico.getId();
            String problema = servico.getProblema();
            String descricao = servico.getDescricao();
            int tipoProblema = servico.getTipoProblema();

            // Altera a colaborador na base de dados
            String SQL = "UPDATE cooperativas_servicos SET nome='" + problema + "', descricao='" + descricao + "', idservico=" + tipoProblema + " WHERE idcooperativas_servicos=" + id;

            conn = this.conn;
            ps = conn.prepareStatement(SQL);
            ps.executeUpdate();

        } catch (SQLException sqle) {
            throw new CooperDAOException("Erro ao alterar dados " + sqle);
        } finally {
            ConnectionCooperFactory.closeConnection(conn, ps);
        }
    } // Fim do alterar

    // Remove uma colaborador no BD
    public void remover(ServicoBean servico) throws CooperDAOException {
        PreparedStatement ps = null;
        Connection conn = null;

        if (servico == null) {
            throw new CooperDAOException("O valor passado não pode ser nulo");
        }

        try {
            int id = servico.getId();

            String SQL;

            // Remove a colaborador na base de dados
            SQL = "DELETE FROM cooperativas_servicos WHERE idcooperativas_servicos=" + id;

            conn = this.conn;
            ps = conn.prepareStatement(SQL);
            ps.executeUpdate();
        } catch (SQLException sqle) {
            throw new CooperDAOException("Erro ao remover dados " + sqle);
        } finally {
            ConnectionCooperFactory.closeConnection(conn, ps);
        }
    } // Fim do remover

    // Consulta servicos na página de busca do prestador 
    public ArrayList<ServicoBean> consultar(String nomePesquisa, int pagina, int idColab) throws CooperDAOException {
        PreparedStatement ps = null;
        ResultSet rs = null;

        try {

            // Essa String tem que ser olhada com cuidado
            String SQL = "SELECT c.*, coop.nome as cooperativa, coop.cidade as local "
                    + "FROM cooperativas_servicos c "
                    + "INNER JOIN cooperativas coop "
                    + "ON c.idcooperativa = coop.idcooperativas "
                    + "WHERE c.nome LIKE '%" + nomePesquisa + "%' AND feito = 0 "
                    + "AND c.idcooperativas_servicos not in "
                    + "(select idservico from id_colaboradores_servicos where idcolaborador = " + idColab + ")"
                    + "ORDER BY c.nome ASC LIMIT " + pagina * 15 + ",15";


            conn = this.conn;
            ps = conn.prepareStatement(SQL);
            rs = ps.executeQuery();
            ArrayList novo = new ArrayList();

            while (rs.next()) {
                int id = (Integer) rs.getObject("idcooperativas_servicos");
                String problema = rs.getObject("nome").toString();
                String descricao = rs.getObject("descricao").toString();
                int tipoProblema = (Integer) rs.getObject("idservicos");
                int feito = (Integer) rs.getObject("feito");
                String local = rs.getObject("local").toString();
                String cooperativa = rs.getObject("cooperativa").toString();
                //ARRUMAR AQUI 
                int idCooperativa = (Integer) rs.getObject("idcooperativa");
                ServicoBean sb = new ServicoBean(id, problema, descricao, tipoProblema, idCooperativa, feito);
                sb.setLocal(local);
                sb.setCooperativa(cooperativa);
                novo.add(sb);
            }
            return novo;
        } catch (SQLException sqle) {
            throw new CooperDAOException(sqle);
        } finally {
            // Tem que alterar isso aqui, claramente
            ConnectionCooperFactory.closeConnection(conn, ps, rs);
        }
    } // Fim do consultar

    public int getTotal() throws CooperDAOException {
        return this.total;
    }

    /////////////////////////////////////////////////////////////////////////
    //Tipo servico
    //////////////////////////////////////////////////////////////////////////
    public ArrayList<TipoServicoBean> consultarTipoServico() throws CooperDAOException {
        PreparedStatement ps = null;
        ResultSet rs = null;

        try {
            String SQL = "SELECT * FROM servicos";

            conn = this.conn;
            ps = conn.prepareStatement(SQL);
            rs = ps.executeQuery();
            ArrayList novo = new ArrayList();

            while (rs.next()) {
                int id = (Integer) rs.getObject("idservicos");
                String tipoServico = rs.getObject("nome").toString();

                novo.add(new TipoServicoBean(id, tipoServico));
            }
            return novo;
        } catch (SQLException sqle) {
            throw new CooperDAOException(sqle);
        } finally {
            // Tem que alterar isso aqui, claramente
            ConnectionCooperFactory.closeConnection(conn, ps, rs);
        }
    } // Fim do consultar

    //consulta os servicos de determinada cooperativa para apresentar para ela em sua pagina de servicos
    public ArrayList<ServicoBean> consultarCoopServico(int idCoop, int pagina) throws CooperDAOException {
        PreparedStatement ps = null;
        ResultSet rs = null;

        try {

            /*
             * ps = this.conn.prepareStatement("Select count(1) as num from
             * colaboradores where nome like '%" + nomePesquisa+"%'"); rs =
             * ps.executeQuery(); rs.next(); this.total=(Integer)
             * rs.getObject("num");
             */
            // Talvez tenha que fazer a paginação, esse é o protótipo por enquanto           
            // Essa String tem que ser olhada com cuidado
            String SQL = "SELECT * FROM cooperativas_servicos WHERE idcooperativa = " + idCoop + " ORDER BY nome ASC LIMIT " + pagina * 15 + ",15";

            conn = this.conn;
            ps = conn.prepareStatement(SQL);
            rs = ps.executeQuery();
            ArrayList novo = new ArrayList();

            while (rs.next()) {
                int id = (Integer) rs.getObject("idcooperativas_servicos");
                String problema = rs.getObject("nome").toString();
                String descricao = rs.getObject("descricao").toString();
                int tipoProblema = (Integer) rs.getObject("idservicos");
                int feito = (Integer) rs.getObject("feito");

                //ARRUMAR AQUI 
                int idCooperativa = (Integer) rs.getObject("idcooperativa");

                novo.add(new ServicoBean(id, problema, descricao, tipoProblema, idCooperativa, feito));
            }
            return novo;
        } catch (SQLException sqle) {
            throw new CooperDAOException(sqle);
        } finally {
            // Tem que alterar isso aqui, claramente
            ConnectionCooperFactory.closeConnection(conn, ps, rs);
        }
    }

    //altera um servico pra realizado quando uma cooperativa define que o servico esta encerrado
    public void alterarRealizado(int idServico, int idColab) throws CooperDAOException {
        PreparedStatement ps = null;
        Connection conn = null;


        try {

            // Altera a colaborador na base de dados
            String SQL = "UPDATE cooperativas_servicos SET feito=1 WHERE idcooperativas_servicos=" + idServico;

            conn = this.conn;
            ps = conn.prepareStatement(SQL);
            ps.executeUpdate();

        } catch (SQLException sqle) {
            throw new CooperDAOException("Erro ao alterar dados " + sqle);
        } finally {
            ConnectionCooperFactory.closeConnection(conn, ps);
        }
    }

    //quando o colaborador clica no botao AJUDAR na pagina de visualizar servicos abertos dele
    public void ajudaColaborador(int idServico, int idColab) throws CooperDAOException {

        PreparedStatement ps = null;
        Connection conn = null;

        try {

            // Insere a colaborador na base de dados
            String SQL = "INSERT INTO id_colaboradores_servicos (idcolaborador,idservico,ajudou) VALUES (" + idColab + "," + idServico + "," + 0 + ")";

            conn = this.conn;
            ps = conn.prepareStatement(SQL);
            ps.executeUpdate();

        } catch (SQLException sqle) {
            throw new CooperDAOException("Erro ao inserir dados " + sqle);
        } finally {
            ConnectionCooperFactory.closeConnection(conn, ps);
        }

    }

    // Consulta servicos na página de busca do prestador 
    public ArrayList consultarServicoDetalhesPrest(int idServ) throws CooperDAOException {
        PreparedStatement ps = null;
        ResultSet rs = null;

        try {

            // Essa String tem que ser olhada com cuidado
            String SQL = "SELECT c.*, coop.* "
                    + "FROM cooperativas_servicos c "
                    + "INNER JOIN cooperativas coop "
                    + "ON c.idcooperativa = coop.idcooperativas "
                    + "WHERE c.idcooperativas_servicos = " + idServ + " "
                    + "ORDER BY c.nome ASC";

            conn = this.conn;
            ps = conn.prepareStatement(SQL);
            rs = ps.executeQuery();
            ArrayList novo = new ArrayList();

            while (rs.next()) {
                {
                    int id = (Integer) rs.getObject("c.idcooperativas_servicos");
                    String problema = rs.getObject("c.nome").toString();
                    String descricao = rs.getObject("c.descricao").toString();
                    int tipoProblema = (Integer) rs.getObject("c.idservicos");
                    int feito = (Integer) rs.getObject("c.feito");
                    int idCooperativa = (Integer) rs.getObject("c.idcooperativa");
                    ServicoBean sb = new ServicoBean(id, problema, descricao, tipoProblema, idCooperativa, feito);
                    novo.add(sb);
                }
                {
                    int id = (Integer) rs.getObject("coop.idcooperativas");
                    String responsavel = rs.getObject("coop.responsavel").toString();
                    String nome = rs.getObject("coop.nome").toString();
                    String rua = rs.getObject("coop.rua").toString();
                    String numero = rs.getObject("coop.numero").toString();
                    String bairro = rs.getObject("coop.bairro").toString();
                    String cidade = rs.getObject("coop.cidade").toString();
                    String estado = rs.getObject("coop.estado").toString();
                    String cnpj = rs.getObject("coop.cnpj").toString();
                    String ie = rs.getObject("coop.ie").toString(); // Inscrição Estadual
                    String email = rs.getObject("coop.email").toString();
                    String telefone = rs.getObject("coop.telefone").toString();
                    CooperativaBean cb = new CooperativaBean(id, responsavel, nome, rua, numero, bairro, cidade, estado, cnpj, ie, email, telefone);
                    novo.add(cb);
                }
            }
            return novo;
        } catch (SQLException sqle) {
            throw new CooperDAOException(sqle);
        } finally {
            // Tem que alterar isso aqui, claramente
            ConnectionCooperFactory.closeConnection(conn, ps, rs);
        }
    } // Fim do consultar

    // Consulta servicos na página de busca do prestador 
    public ArrayList consultarPrestadoresInteressados(int idServ) throws CooperDAOException {
        PreparedStatement ps = null;
        ResultSet rs = null;

        try {

            // Essa String tem que ser olhada com cuidado
            String SQL = "SELECT c.*, colab.* "
                    + "FROM cooperativas_servicos c "
                    + "INNER JOIN id_colaboradores_servicos idcs "
                    + "ON c.idcooperativas_servicos = idcs.idservico "
                    + "INNER JOIN colaboradores colab "
                    + "on idcs.idcolaborador = colab.idcolaboradores "
                    + "WHERE  c.idcooperativas_servicos = " + idServ + " "
                    + "ORDER BY c.nome ASC";



            conn = this.conn;
            ps = conn.prepareStatement(SQL);
            rs = ps.executeQuery();
            ArrayList novo = new ArrayList();
            boolean isFirst = true;
            while (rs.next()) {
                if(isFirst)
                {
                    int id = (Integer) rs.getObject("c.idcooperativas_servicos");
                    String problema = rs.getObject("c.nome").toString();
                    String descricao = rs.getObject("c.descricao").toString();
                    int tipoProblema = (Integer) rs.getObject("c.idservicos");
                    int feito = (Integer) rs.getObject("c.feito");
                    int idCooperativa = (Integer) rs.getObject("c.idcooperativa");
                    ServicoBean sb = new ServicoBean(id, problema, descricao, tipoProblema, idCooperativa, feito);
                    novo.add(sb);
                    isFirst = false;
                }
                {
                    int id = (Integer) rs.getObject("colab.idcolaboradores");
                    String nome = rs.getObject("colab.nome").toString();
                    String profissao = rs.getObject("colab.profissao").toString();
                    String rua = rs.getObject("colab.rua").toString();
                    String numero = rs.getObject("colab.numero").toString();
                    String bairro = rs.getObject("colab.bairro").toString();
                    String cidade = rs.getObject("colab.cidade").toString();
                    String estado = rs.getObject("colab.estado").toString();
                    String email = rs.getObject("colab.email").toString();
                    String telefone = rs.getObject("colab.telefone").toString();
                    novo.add(new ColaboradorBean(id, nome, profissao, rua, numero, bairro, cidade, estado, email, telefone));
                }
            }
            return novo;
        } catch (SQLException sqle) {
            throw new CooperDAOException(sqle);
        } finally {
            // Tem que alterar isso aqui, claramente
            ConnectionCooperFactory.closeConnection(conn, ps, rs);
        }
    } // Fim do consultar
}
